/*
    Copyright 2009 Spencer B. Koehler, Ph.D.

    This file is part of the Brillig Toolkit.

    The Brillig Toolkit is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    The Brillig Toolkit is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with The Brillig Toolkit.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.brillig.io;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class PublishableException extends PublishableString {
  private String className;
  private String stackTrace;
  private String message;
  
  /**
   * Default constructor for reconstruction.
   */
  public PublishableException() {
    this(null, null);
  }

  /**
   * Construct with the given string.
   */
  public PublishableException(Exception e, String message) {
    this.className = e.getClass().getName();
    this.stackTrace = FileUtil.getStackTrace(e);
    this.message = message;
  }

  /**
   * Write thie message to the dataOutput stream such that this message
   * can be completely reconstructed through this.read(dataInput).
   *
   * @param dataOutput  the data output to write to.
   */
  public void write(DataOutput dataOutput) throws IOException {
    DataHelper.writeString(dataOutput, className);
    DataHelper.writeString(dataOutput, stackTrace);
    DataHelper.writeString(dataOutput, message);
  }

  /**
   * Read this message's contents from the dataInput stream that was written by
   * this.write(dataOutput).
   * <p>
   * NOTE: this requires all implementing classes to have a default constructor
   *       with no args.
   *
   * @param dataInput  the data output to write to.
   */
  public void read(DataInput dataInput) throws IOException {
    this.className = DataHelper.readString(dataInput);
    this.stackTrace = DataHelper.readString(dataInput);
    this.message = DataHelper.readString(dataInput);
  }

}
